<html>
<meta http-equiv="Content-Type" 	content="text/html;charset=utf-8"/>

<body>
关于js的callback回调函数的理解
回调函数的处理逻辑理解：<br></br>

所谓的回调函数处理逻辑，其实就是先将回调函数的代码 冻结（或者理解为闲置），接着将这个回调函数的代码放到回调函数管理器的队列里面。<br></br>

待回调函数被触发调用的时候，对应的回调函数的代码才会从管理器队列取出来并自动执行（激活回调函数的代码），实现异步的编程效果。<br></br>


上面的例子可以看到，实际上回调函数是层层执行的。执行完最深的那层，再逐一向上执行。<br></br>
执行用户购买玻璃的方法的时候，程序的执行顺序:<br></br>
主函数的执行顺序：<br></br>
userBuy(用户调用购买货物的方法)         父<br></br>
-->vendor2(二级供应商提供货物的方法)    子<br></br>
-->vendor1(一级供应商提供货物的方法)    孙<br></br>
-->make(工厂制造过程的方法)             曾孙<br></br>
</body>

<script>
//制造过程函数：
var make = function(qty,type,callback){
	//接到订单，也要检查数量和类型。有些类型可能无法生产！
	//makeCheck();
	//根据qty数量和type类型来制造需要的玻璃
	//要经过很多道工序的生产。。。
	//factory.makeGlass();
	console.log('factory.makeGlass')
	//做完之后，就调用回调函数，通知已经制造好啦！可以来拿货。当然要收钱啊。就是提供价格给调用者（批量出厂的价格）。
	var amount=qty*10;
	callback(amount);
}

//一级供应商函数：
var vendor1 = function(qty,type,callback){
	//接到订单，也要重复做检查数量和类型。
	//vendor1Check();
	//向工厂订货。要的数量和类型是需要指定的。一级供应商不需要知道怎么制造的，只需要通知工厂要货即可
	make(qty,type,function(amount){
	//工厂制造完毕，接到工厂的报价之后，这里一级供应商当然要赚钱，所以要加价10%
	var vendorAmount=amount*1.1;
	//执行父亲提供的回调函数代码，并且通知一级供应商提供的价格是多少(主动提供回调函数的参数)。
	callback(vendorAmount);
	});
}


//二级供应商函数：
var vendor2 ={
		vendor2:function(qty,type,callback){
			//接到订单，接着检查数量和类型是否正确。是否可以生产这种类型的玻璃。
			vendor2.vendor2Check();
			//二级供应商不需要知道货是哪里拿的，只需要通知一级供应商要货即可
			//接着向一级供应商订货。要的数量和类型是需要指定的
			vendor1(qty,type,function(amount){
			//货到，接到一级供应商的报价之后，这里二级供应商当然要赚钱，所以要加价20%
			var vendorAmount=amount*1.2;
			//执行对外的回调函数，并且通知用户，它提供的价格是多少。
			callback(vendorAmount);
			});
		},
		vendor2Check:function(){console.log('vendor2Check');}				
}
	
	


//用户函数：用户是最终的消费者。
var user = {
	//用户购买玻璃的函数方法:
	userBuy: function(qty,type,callback){
	//核对数量是否正确，玻璃类型是否是需要的。
	user.userCheck();
	//用户向二级供应商拿货。需要注意的是，到货之后就可以进行安装等动作。都写在callback里面。
	vendor2.vendor2(qty,type,function(amount){//调用二级供应商的接口。并且写好回调函数，知道价格之后做什么。
	//这里写的是玻璃到货之后的执行的动作。可能是10天之后才执行的。
	user.receive();//用户收货
	user.check();//用户检查货物质量
	user.pay(amount);//用户付款
	callback;//这里执行一个回调函数，可以是安装玻璃，甚至可以送给别人等等。由调用者决定做什么事情。
	});
},
userCheck:function(){console.log('userCheck');},
receive:function(){console.log('receive');},
check:function(){console.log('check');},
pay:function(amount){console.log('pay:'+amount);},
安装玻璃:function(){console.log('安装玻璃');},
吃饭:function(){console.log('吃饭');},
上厕所:function(){console.log('厕所');},
sleep:function(){console.log('睡觉');},
}
	//程序处理过程:
	user.吃饭();
	//买玻璃
	user.userBuy(5,'镀膜建筑玻璃',function(amount){
	user.安装玻璃();
	});
	user.上厕所();//由于买玻璃是异步函数，所以，这里发出买玻璃的请求（调用买玻璃的函数）之后，立刻可以去上厕所了，片刻不影响！
	user.sleep();//用户上厕所完毕，舒服了，睡觉去！


</script>

</html>